Mocking Framework (Moq) দিয়ে Controller এবং Service টেস্ট করা

Microsoft Technologies - এএসপি ডট নেট এমভিসি (ASP.Net MVC) ইউনিট টেস্টিং এবং টেস্ট ড্রাইভন ডেভেলপমেন্ট (TDD) |
203
203

Moq একটি জনপ্রিয় Mocking Framework, যা ASP.Net MVC এবং ASP.Net Core অ্যাপ্লিকেশনগুলোর জন্য Unit Testing এর সময় Dependency Mocking করতে ব্যবহৃত হয়। এটি টেস্ট ড্রাইভেন ডেভেলপমেন্ট (TDD)-এ সহায়ক এবং ডেভেলপারদের নির্দিষ্ট অংশের কোড টেস্ট করার জন্য অন্যান্য অংশের Dependency এর বাস্তবায়ন ছাড়া টেস্ট সম্পন্ন করতে দেয়।


Mocking Framework কী?

Mocking Framework ব্যবহার করে অ্যাপ্লিকেশনের বিভিন্ন Dependency যেমন Service, Repository বা Database Context এর মক (Mock) অবজেক্ট তৈরি করা হয়। এটি টেস্টের সময় প্রকৃত ডেটার পরিবর্তে কাল্পনিক ডেটা সরবরাহ করে। এর ফলে কোড নির্ভরযোগ্য এবং দ্রুত টেস্ট করা যায়।

Moq Framework-এর বৈশিষ্ট্য:

  • ইন্টারফেস মকিং: এটি ইন্টারফেস ভিত্তিক ডিপেন্ডেন্সি মক করতে পারে।
  • কাস্টম রেসপন্স: নির্দিষ্ট পদ্ধতির জন্য কাস্টম রেসপন্স প্রদান করা যায়।
  • টাইপ সেফটি: Moq টাইপ সেফ কোড প্রদান করে, ফলে কমপাইল টাইম ত্রুটি সহজেই ধরা যায়।
  • Verify মেথড: এটি নিশ্চিত করে যে একটি নির্দিষ্ট মেথড কতবার এবং কীভাবে ডাকা হয়েছে।

Moq দিয়ে Controller এবং Service টেস্ট করার ধাপ

১. প্রয়োজনীয় প্যাকেজ ইন্সটল

Moq ব্যবহার করার জন্য NuGet থেকে Moq প্যাকেজটি ইন্সটল করতে হবে। Visual Studio-তে Package Manager Console থেকে কমান্ডটি রান করুন:

Install-Package Moq

২. উদাহরণ প্রকল্প: Controller এবং Service

ধরা যাক, আমাদের একটি ProductController আছে, যেটি একটি IProductService ইন্টারফেস ব্যবহার করে। Service টেস্ট করার জন্য Moq ব্যবহার করা হবে।

IProductService ইন্টারফেস:

public interface IProductService
{
    IEnumerable<Product> GetAllProducts();
    Product GetProductById(int id);
}

ProductController:

public class ProductController : Controller
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    }

    public IActionResult Index()
    {
        var products = _productService.GetAllProducts();
        return View(products);
    }

    public IActionResult Details(int id)
    {
        var product = _productService.GetProductById(id);
        if (product == null)
            return NotFound();

        return View(product);
    }
}

৩. Moq দিয়ে Controller টেস্ট করা

নিচে ProductController এর Index এবং Details মেথড টেস্ট করার জন্য Moq ব্যবহার করা হয়েছে।

using Moq;
using Xunit;

public class ProductControllerTests
{
    [Fact]
    public void Index_ReturnsViewWithProducts()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(service => service.GetAllProducts()).Returns(new List<Product>
        {
            new Product { Id = 1, Name = "Product A" },
            new Product { Id = 2, Name = "Product B" }
        });

        var controller = new ProductController(mockService.Object);

        // Act
        var result = controller.Index() as ViewResult;

        // Assert
        Assert.NotNull(result);
        var products = result.Model as List<Product>;
        Assert.Equal(2, products.Count);
        Assert.Equal("Product A", products[0].Name);
    }

    [Fact]
    public void Details_ReturnsNotFound_WhenProductDoesNotExist()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(service => service.GetProductById(It.IsAny<int>())).Returns((Product)null);

        var controller = new ProductController(mockService.Object);

        // Act
        var result = controller.Details(1);

        // Assert
        Assert.IsType<NotFoundResult>(result);
    }

    [Fact]
    public void Details_ReturnsViewWithProduct_WhenProductExists()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(service => service.GetProductById(1)).Returns(new Product { Id = 1, Name = "Product A" });

        var controller = new ProductController(mockService.Object);

        // Act
        var result = controller.Details(1) as ViewResult;

        // Assert
        Assert.NotNull(result);
        var product = result.Model as Product;
        Assert.Equal(1, product.Id);
        Assert.Equal("Product A", product.Name);
    }
}

Moq Verify মেথড ব্যবহার

Verify মেথড দিয়ে নিশ্চিত করা যায় যে Service এর মেথড কতবার এবং কীভাবে ডাকা হয়েছে।

[Fact]
public void Index_CallsGetAllProductsOnce()
{
    // Arrange
    var mockService = new Mock<IProductService>();
    mockService.Setup(service => service.GetAllProducts()).Returns(new List<Product>());
    var controller = new ProductController(mockService.Object);

    // Act
    controller.Index();

    // Assert
    mockService.Verify(service => service.GetAllProducts(), Times.Once);
}

Moq এর সুবিধা

  • নির্ভরশীল অবজেক্টের বাস্তবায়ন ছাড়াই কোড টেস্ট করা যায়।
  • ডিপেন্ডেন্সি ইনভার্সন এবং SOLID নীতিমালা অনুসরণে সাহায্য করে।
  • কোড টেস্ট করার সময় সময় এবং রিসোর্স সাশ্রয়ী।

সারমর্ম

Moq Framework ব্যবহার করে ডিপেন্ডেন্সি মকিং করার মাধ্যমে ASP.Net MVC অ্যাপ্লিকেশনের Controller এবং Service টেস্ট করা সহজ এবং কার্যকর হয়। এটি টেস্টিং প্রক্রিয়াকে দ্রুততর করে এবং নির্ভরযোগ্য কোড তৈরি করতে সাহায্য করে। Mocking এবং Verify মেথডের কার্যকর ব্যবহার অ্যাপ্লিকেশনের লজিক এবং ডিপেন্ডেন্সি উভয়েরই নির্ভুলতা নিশ্চিত করে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion